From 4d04d7278dbb52fb75132ae60047cadc749590d1 Mon Sep 17 00:00:00 2001 From: "kaf24@firebug.cl.cam.ac.uk" Date: Wed, 17 May 2006 23:28:22 +0100 Subject: [PATCH] When doing local migration, a timing-related problem occurred due to the frontend switching to the Closed state, which could end up having the .remove function being called after the backend has shut down. This now fixes the problem by switching to the Closing state. The other part of the patch cleans up freeing of memory. Signed-off-by: Stefan Berger --- linux-2.6-xen-sparse/drivers/char/tpm/tpm_xen.c | 2 +- linux-2.6-xen-sparse/drivers/xen/tpmback/common.h | 2 -- linux-2.6-xen-sparse/drivers/xen/tpmback/interface.c | 10 +--------- linux-2.6-xen-sparse/drivers/xen/tpmback/tpmback.c | 2 +- linux-2.6-xen-sparse/drivers/xen/tpmback/xenbus.c | 2 +- 5 files changed, 4 insertions(+), 14 deletions(-) diff --git a/linux-2.6-xen-sparse/drivers/char/tpm/tpm_xen.c b/linux-2.6-xen-sparse/drivers/char/tpm/tpm_xen.c index bf58e109dd..9c0618f68c 100644 --- a/linux-2.6-xen-sparse/drivers/char/tpm/tpm_xen.c +++ b/linux-2.6-xen-sparse/drivers/char/tpm/tpm_xen.c @@ -416,7 +416,7 @@ static int tpmfront_suspend(struct xenbus_device *dev) */ interruptible_sleep_on_timeout(&tp->wait_q, 100); } - xenbus_switch_state(dev, XenbusStateClosed); + xenbus_switch_state(dev, XenbusStateClosing); if (atomic_read(&tp->tx_busy)) { /* diff --git a/linux-2.6-xen-sparse/drivers/xen/tpmback/common.h b/linux-2.6-xen-sparse/drivers/xen/tpmback/common.h index 0fafd57096..744248d638 100644 --- a/linux-2.6-xen-sparse/drivers/xen/tpmback/common.h +++ b/linux-2.6-xen-sparse/drivers/xen/tpmback/common.h @@ -45,8 +45,6 @@ typedef struct tpmif_st { long int tpm_instance; unsigned long mmap_vstart; - struct work_struct work; - grant_handle_t shmem_handle; grant_ref_t shmem_ref; struct page *pagerange; diff --git a/linux-2.6-xen-sparse/drivers/xen/tpmback/interface.c b/linux-2.6-xen-sparse/drivers/xen/tpmback/interface.c index 0992ad962d..39117458d5 100644 --- a/linux-2.6-xen-sparse/drivers/xen/tpmback/interface.c +++ b/linux-2.6-xen-sparse/drivers/xen/tpmback/interface.c @@ -152,10 +152,8 @@ int tpmif_map(tpmif_t *tpmif, unsigned long shared_page, unsigned int evtchn) return 0; } -static void __tpmif_disconnect_complete(void *arg) +void tpmif_disconnect_complete(tpmif_t *tpmif) { - tpmif_t *tpmif = (tpmif_t *) arg; - if (tpmif->irq) unbind_from_irqhandler(tpmif->irq, tpmif); @@ -167,12 +165,6 @@ static void __tpmif_disconnect_complete(void *arg) free_tpmif(tpmif); } -void tpmif_disconnect_complete(tpmif_t * tpmif) -{ - INIT_WORK(&tpmif->work, __tpmif_disconnect_complete, (void *)tpmif); - schedule_work(&tpmif->work); -} - void __init tpmif_interface_init(void) { tpmif_cachep = kmem_cache_create("tpmif_cache", sizeof (tpmif_t), diff --git a/linux-2.6-xen-sparse/drivers/xen/tpmback/tpmback.c b/linux-2.6-xen-sparse/drivers/xen/tpmback/tpmback.c index 302d9e9f9f..0aa980e58f 100644 --- a/linux-2.6-xen-sparse/drivers/xen/tpmback/tpmback.c +++ b/linux-2.6-xen-sparse/drivers/xen/tpmback/tpmback.c @@ -1063,7 +1063,7 @@ static int __init tpmback_init(void) module_init(tpmback_init); -static void __exit tpmback_exit(void) +void __exit tpmback_exit(void) { vtpm_release_packets(NULL, 0); tpmif_xenbus_exit(); diff --git a/linux-2.6-xen-sparse/drivers/xen/tpmback/xenbus.c b/linux-2.6-xen-sparse/drivers/xen/tpmback/xenbus.c index 61b9250e8d..fc5313071c 100644 --- a/linux-2.6-xen-sparse/drivers/xen/tpmback/xenbus.c +++ b/linux-2.6-xen-sparse/drivers/xen/tpmback/xenbus.c @@ -150,7 +150,7 @@ static void frontend_changed(struct xenbus_device *dev, break; case XenbusStateClosing: - xenbus_switch_state(dev, XenbusStateClosing); + be->tpmif->tpm_instance = -1; break; case XenbusStateClosed: -- 2.30.2